package com.suny.fork_join;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveAction;
import java.util.logging.Logger;

/**
 * 无返回值
 */
public class CustomRecursiveAction extends RecursiveAction {

    private String workload = "";
    private static final int THRESHOLD = 4;

    private static Logger logger =
            Logger.getAnonymousLogger();

    public CustomRecursiveAction(String workload) {
        this.workload = workload;
    }

    /**
     * 分割工作的方法
     *
     * @author sunny
     * @date 2019/10/30 下午3:06
     */
    @Override
    protected void compute() {
        if (workload.length() > THRESHOLD) {
            //invokeAll() 方法是将 ForkJoinTasks 序列提交给 ForkJoinPool 的最方便的方法。它将任务作为参数 ( 两个任务，var args 或集合 ），fork 它们，并按照生成它们的顺序返回 Future 对象的集合。
            ForkJoinTask.invokeAll(createSubtasks());
        } else {
            processing(workload);
        }
    }

    /**
     * 执行工作的方法
     *
     * @author sunny
     * @date 2019/10/30 下午3:06
     * @return java.util.List<com.suny.fork_join.CustomRecursiveAction>
     */
    private List<CustomRecursiveAction> createSubtasks() {
        List<CustomRecursiveAction> subtasks = new ArrayList<>();

        String partOne = workload.substring(0, workload.length() / 2);
        String partTwo = workload.substring(workload.length() / 2, workload.length());

        subtasks.add(new CustomRecursiveAction(partOne));
        subtasks.add(new CustomRecursiveAction(partTwo));

        return subtasks;
    }

    /**
     * 执行工作的方法
     * @param work 数据
     */
    private void processing(String work) {
        String result = work.toUpperCase();
        logger.info("This result - (" + result + ") - was processed by "
                + Thread.currentThread().getName());
    }
}